Passed
Push — master ( 0c1a1a...31a910 )
by EMP
01:14
created

main.js ➔ navMenu   B

Complexity

Conditions 6

Size

Total Lines 16
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 11
dl 0
loc 16
rs 8.6666
c 0
b 0
f 0
cc 6
1
"use strict";
2
3
sodium.ready.then(function() {
4
5
const ae = new AllEars(function(ok) {
6
	if (ok) {
7
		document.getElementById("btn_enter").disabled = false;
8
	} else {
9
		console.log("Failed to load All-Ears");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
10
	}
11
});
12
13
let page=0;
14
15
function navMenu(num) {
16
	document.getElementById("div_readmsg").hidden = true;
17
18
	const b = document.getElementsByTagName("nav")[0].getElementsByTagName("button");
19
	const d = document.getElementsByClassName("maindiv");
20
21
	for (let i = 0; i < 5; i++) {
22
		if (i === num) {
23
			b[i].disabled = true;
24
			d[i].hidden = false;
25
		} else {
26
			b[i].disabled = false;
27
			d[i].hidden = true;
28
		}
29
	}
30
}
31
32
function getCountryFlag(countryCode) {
33
	return sodium.to_string(new Uint8Array([
34
		240, 159, 135, 166 + countryCode.codePointAt(0) - 65,
35
		240, 159, 135, 166 + countryCode.codePointAt(1) - 65
36
	]));
37
}
38
39
function deleteButtonShow(show) {
40
	if (show) {
41
		document.getElementById("btn_msgdel").hidden = false;
42
		return;
43
	}
44
45
	const checkboxes = document.getElementById("tbd_inbox").getElementsByTagName("input");
46
	let checked = false;
47
48
	for (let j = 0; j < checkboxes.length; j++) {
49
		if (checkboxes[j].checked) {
50
			checked = true;
51
			break;
52
		}
53
	}
54
55
	document.getElementById("btn_msgdel").hidden = !checked;
56
}
57
58
function addIntMessage(i) {
59
	const tbl = document.getElementById("tbd_inbox");
60
	const row = tbl.insertRow(-1);
61
62
	const ts = ae.getIntMsgTime(i);
63
	let cell = row.insertCell(-1);
64
	cell.setAttribute("data-ts", ts);
65
	cell.textContent = new Date(ts * 1000).toISOString().slice(0, 16).replace("T", " ");
66
	cell.className = "mono";
67
68
	cell = row.insertCell(-1);
69
	cell.textContent = ae.getIntMsgTitle(i);
70
	cell.onclick = function() {
71
		navMenu(-1);
72
		document.getElementById("div_readmsg").hidden = false;
73
		document.getElementById("readmsg_head").hidden = false;
74
		document.getElementById("readmsg_levelinfo").hidden = false;
75
		document.getElementById("readmsg_extmsg").hidden = true;
76
77
		document.getElementById("readmsg_title").textContent = ae.getIntMsgTitle(i);
78
		document.getElementById("readmsg_from").textContent  = ae.getIntMsgFrom(i);
79
		document.getElementById("readmsg_to").textContent    = ae.getIntMsgTo(i);
80
		document.getElementById("readmsg_body").textContent  = ae.getIntMsgBody(i);
81
		document.getElementById("readmsg_level").textContent = ae.getIntMsgLevel(i);
82
83
		document.getElementById("readmsg_from").className = (ae.getIntMsgFrom(i).length === 16) ? "mono" : "";
84
		document.getElementById("readmsg_to").className = (ae.getIntMsgTo(i).length === 16) ? "mono" : "";
85
	};
86
87
	// empty From1 cell
88
	row.insertCell(-1);
89
90
	cell = row.insertCell(-1);
91
	cell.textContent = ae.getIntMsgFrom(i);
92
	cell.className = (ae.getIntMsgFrom(i).length === 16) ? "mono" : "";
93
94
	cell = row.insertCell(-1);
95
	cell.textContent = ae.getIntMsgTo(i);
96
	cell.className = (ae.getIntMsgTo(i).length === 16) ? "mono" : "";
97
98
	cell = row.insertCell(-1);
99
	cell.innerHTML = "<input class=\"delMsg\" type=\"checkbox\" data-id=\"" + ae.getIntMsgIdHex(i) + "\">";
100
	cell.children[0].onchange = function() {deleteButtonShow(this.checked);};
101
}
102
103
function addExtMessage(i) {
104
	const tbl = document.getElementById("tbd_inbox");
105
	const row = tbl.insertRow(-1);
106
107
	const ts = ae.getExtMsgTime(i);
108
	let cell = row.insertCell(-1);
109
	cell.setAttribute("data-ts", ts);
110
	cell.textContent = new Date(ts * 1000).toISOString().slice(0, 16).replace("T", " ");
111
	cell.className = "mono";
112
113
	cell = row.insertCell(-1);
114
	cell.textContent = ae.getExtMsgTitle(i);
115
	cell.onclick = function() {
116
		navMenu(-1);
117
		document.getElementById("div_readmsg").hidden = false;
118
		document.getElementById("readmsg_head").hidden = false;
119
		document.getElementById("readmsg_levelinfo").hidden = true;
120
		document.getElementById("readmsg_extmsg").hidden = false;
121
		document.getElementById("readmsg_greet").textContent = ae.getExtMsgGreet(i);
122
		document.getElementById("readmsg_tls").textContent = ae.getExtMsgTLS(i);
123
		document.getElementById("readmsg_ip").textContent = ae.getExtMsgIp(i);
124
125
		document.getElementById("readmsg_country").textContent = getCountryFlag(ae.getExtMsgCcode(i));
126
		document.getElementById("readmsg_country").title = ae.getExtMsgCname(i);
127
128
		const flags = document.getElementById("readmsg_flags").children;
129
		flags[0].hidden = ae.getExtMsgFlagPExt(i);
130
		flags[1].hidden = !ae.getExtMsgFlagRare(i);
131
		flags[2].hidden = !ae.getExtMsgFlagFail(i);
132
		flags[3].hidden = !ae.getExtMsgFlagPErr(i);
133
134
		document.getElementById("readmsg_title").textContent = ae.getExtMsgTitle(i);
135
		document.getElementById("readmsg_from").textContent = ae.getExtMsgEnvFrom(i);
136
		document.getElementById("readmsg_to").textContent = ae.getExtMsgEnvTo(i);
137
		document.getElementById("readmsg_body").innerHTML = ae.getExtMsgBody(i);
138
		document.getElementById("readmsg_headers").textContent = ae.getExtMsgHeaders(i);
139
140
		document.getElementById("readmsg_from").className = "";
141
		document.getElementById("readmsg_to").className = (ae.getExtMsgEnvTo(i).length === 16) ? "mono" : "";
142
	};
143
144
	const from = ae.getExtMsgHdrFrom(i);
145
	const from2 = from.substring(from.indexOf("@") + 1);
146
147
	cell = row.insertCell(-1);
148
	cell.textContent = from.substring(0, from.indexOf("@"));
149
150
	cell = row.insertCell(-1);
151
152
	let el = document.createElement("abbr");
153
	el.textContent = getCountryFlag(ae.getExtMsgCcode(i));
154
	el.title = ae.getExtMsgCname(i);
155
	cell.appendChild(el);
156
157
	el = document.createElement("span");
158
	el.textContent = " " + from2;
159
	cell.appendChild(el);
160
161
	cell = row.insertCell(-1);
162
	cell.textContent = ae.getExtMsgEnvTo(i);
163
	cell.className = (ae.getExtMsgEnvTo(i).length === 16) ? "mono" : "";
164
165
	cell = row.insertCell(-1);
166
	el = document.createElement("input");
167
	el.className = "delMsg";
168
	el.type = "checkbox";
169
	el.setAttribute("data-id", ae.getExtMsgIdHex(i));
170
	el.onchange = function() {deleteButtonShow(this.checked);};
171
	cell.appendChild(el);
172
}
173
174
function addMessages() {
175
	const maxExt = ae.getExtMsgCount();
176
	const maxInt = ae.getIntMsgCount();
177
178
	let numExt = 0;
179
	let numInt = 0;
180
181
	//TODO handle sent messages separately
182
183
	for (let i = 0; i < (page * 20) + 20; i++) {
184
		const tsInt = (numInt < maxInt) ? ae.getIntMsgTime(numInt) : 0;
185
		const tsExt = (numExt < maxExt) ? ae.getExtMsgTime(numExt) : 0;
186
		if (tsInt === 0 && tsExt === 0) break;
187
188
		if (tsInt !== 0 && (tsExt === 0 || tsInt > tsExt)) {
189
			if (i < (page * 20)) {
190
				numInt++;
191
				continue;
192
			}
193
194
			addIntMessage(numInt);
195
			numInt++;
196
		} else if (tsExt !== 0) {
197
			if (i < (page * 20)) {
198
				numExt++;
199
				continue;
200
			}
201
202
			addExtMessage(numExt);
203
			numExt++;
204
		}
205
	}
206
}
207
208
function addFile(num) {
209
	const table = document.getElementById("tbody_files");
210
	const row = table.insertRow(-1);
211
212
	let cell = row.insertCell(-1);
213
	cell.textContent = new Date(ae.getUplMsgTime(num) * 1000).toISOString().slice(0, 10);
214
215
	cell = row.insertCell(-1);
216
	cell.textContent = ae.getUplMsgBytes(num) / 1024;
217
218
	cell = row.insertCell(-1);
219
	cell.textContent = ae.getUplMsgTitle(num);
220
221
	cell = row.insertCell(-1);
222
	cell.innerHTML = "<button type=\"button\">D</button>";
223
	cell.children[0].onclick = function() {ae.downloadUplMsg(num);};
224
225
	cell = row.insertCell(-1);
226
	cell.innerHTML = "<button type=\"button\">X</button>";
227
	cell.children[0].onclick = function() {
228
		ae.Message_Delete([ae.getUplMsgIdHex(num)], function(error) {
229
			if (error === 0) {
230
				row.remove();
231
			} else {
232
				console.log("Failed deleting file");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
233
			}
234
		});
235
	};
236
}
237
238
function destroyAccount(upk_hex) {
239
	const tbl = document.getElementById("tbody_admin");
240
241
	let rowid = -1;
242
243
	for (let i = 0; i < tbl.rows.length; i++) {
244
		if (upk_hex === tbl.rows[i].cells[0].textContent) {
245
			rowid = i;
246
			break;
247
		}
248
	}
249
250
	if (rowid === -1) return;
251
252
	ae.Account_Delete(upk_hex, function(error) {
253
		if (error === 0) {
254
			tbl.deleteRow(rowid);
255
		} else {
256
			console.log("Failed to destroy account");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
257
		}
258
	});
259
}
260
261
function setAccountLevel(upk_hex, level) {
262
	const tbl = document.getElementById("tbody_admin");
263
264
	let rowid = -1;
265
266
	for (let i = 0; i < tbl.rows.length; i++) {
267
		if (tbl.rows[i].cells[0].textContent === upk_hex) {
268
			rowid = i;
269
			break;
270
		}
271
	}
272
273
	if (rowid === -1) return;
274
275
	ae.Account_Update(upk_hex, level, function(error) {
276
		if (error !== 0) {
277
			console.log("Failed to set account level");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
278
			return;
279
		}
280
281
		tbl.rows[rowid].cells[4].textContent = level;
282
283
		if (level === 0) {
284
			tbl.rows[rowid].cells[5].children[0].disabled = false;
285
			tbl.rows[rowid].cells[6].children[0].disabled = true;
286
		} else if (level === ae.getLevelMax()) {
287
			tbl.rows[rowid].cells[5].children[0].disabled = true;
288
			tbl.rows[rowid].cells[6].children[0].disabled = false;
289
		} else {
290
			tbl.rows[rowid].cells[5].children[0].disabled = false;
291
			tbl.rows[rowid].cells[6].children[0].disabled = false;
292
		}
293
294
		const pkHex = ae.admin_getUserPkHex(rowid);
295
		const currentLevel = ae.admin_getUserLevel(rowid);
296
		tbl.rows[rowid].cells[5].children[0].onclick = function() {setAccountLevel(pkHex, currentLevel + 1);};
297
		tbl.rows[rowid].cells[6].children[0].onclick = function() {setAccountLevel(pkHex, currentLevel - 1);};
298
	});
299
}
300
301
function deleteAddress(addr) {
302
	let btns = document.getElementById("tbody_opt_addr").getElementsByTagName("button");
303
	for (let i = 0; i < btns.length; i++) btns[i].disabled = true;
304
305
	let addressToDelete = -1;
306
307
	for (let i = 0; i < ae.getAddressCount(); i++) {
308
		if (addr === ae.getAddress(i)) {
309
			addressToDelete = i;
310
			break;
311
		}
312
	}
313
314
	if (addressToDelete === -1) return;
315
316
	ae.Address_Delete(addressToDelete, function(error) {
317
		if (error !== 0) {
318
			console.log("Failed to delete address");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
319
			return;
320
		}
321
322
		document.getElementById("tbody_opt_addr").deleteRow(addressToDelete);
323
		document.getElementById("send_from").remove(addressToDelete);
324
325
		document.getElementById("addr_use_normal").textContent = ae.getAddressCountNormal();
326
		document.getElementById("addr_use_shield").textContent = ae.getAddressCountShield();
327
328
		if (ae.getAddressCountNormal() < ae.getLimitNormalA(ae.getUserLevel())) document.getElementById("btn_newaddress").disabled = false;
329
		if (ae.getAddressCountShield() < ae.getLimitShieldA(ae.getUserLevel())) document.getElementById("btn_newshieldaddress").disabled = false;
330
331
		ae.Private_Update(function(error2) {
332
			if (error2 !== 0) console.log("Failed to update the Private field");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
333
334
			btns = document.getElementById("tbody_opt_addr").getElementsByTagName("button");
335
			for (let i = 0; i < btns.length; i++) btns[i].disabled = false;
336
		});
337
	});
338
}
339
340
function addAddress(num) {
341
	const addrTable = document.getElementById("tbody_opt_addr");
342
	const row = addrTable.insertRow(-1);
343
344
	let cell = row.insertCell(-1);
345
	cell.textContent = ae.getAddress(num);
346
	if (cell.textContent.length === 16) cell.className = "mono";
347
	cell.onclick = function() {
348
		if (cell.textContent.length === 16)
349
			navigator.clipboard.writeText(ae.shieldMix(cell.textContent) + "@" + ae.getDomainEml());
350
		else
351
			navigator.clipboard.writeText(cell.textContent + "@" + ae.getDomainEml());
352
	};
353
354
	cell = row.insertCell(-1);
355
	cell.innerHTML = ae.getAddressAccExt(num) ? "<input type=\"checkbox\" checked=\"checked\">" : "<input type=\"checkbox\">";
356
357
	cell = row.insertCell(-1);
358
	cell.innerHTML = ae.getAddressAccInt(num) ? "<input type=\"checkbox\" checked=\"checked\">" : "<input type=\"checkbox\">";
359
360
	cell = row.insertCell(-1);
361
	cell.innerHTML = "<button type=\"button\">X</button>";
362
	cell.children[0].onclick = function() {deleteAddress(ae.getAddress(num));};
363
364
	const opt = document.createElement("option");
365
	opt.value = ae.getAddress(num);
366
	opt.textContent = ae.getAddress(num) + "@" + ae.getDomainEml();
367
	document.getElementById("send_from").appendChild(opt);
368
}
369
370
function clearMessages() {
371
	document.getElementById("tbd_inbox").innerHTML = "";
372
	document.getElementById("tbd_snbox").innerHTML = "";
373
	document.getElementById("tbody_files").innerHTML = "";
374
}
375
376
function delMsgs(tblName, btnName) {
377
	const cbs = document.getElementsByClassName("delMsg");
378
	const ids = [];
379
380
	for (let i = 0; i < cbs.length; i++) {
381
		if (cbs[i].checked) ids.push(cbs[i].getAttribute("data-id"));
382
	}
383
384
	if (ids.length > 0) ae.Message_Delete(ids, function(error) {
385
		if (error === 0) {
386
			clearMessages();
387
			addMessages();
388
			document.getElementById(btnName).hidden = true;
389
		} else {
390
			console.log("Failed to delete messages");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
391
		}
392
	});
393
}
394
395
function deleteContact(email) {
396
	const tbl = document.getElementById("tbody_notes_contact");
397
	const rows = tbl.rows;
398
399
	for (let i = 0; i < rows.length; i++) {
400
		if (email === rows[i].cells[0].textContent) {
401
			ae.deleteContact(i);
402
			tbl.deleteRow(i);
403
			break;
404
		}
405
	}
406
407
	document.getElementById("btn_savenotes").hidden = false;
408
}
409
410
function addContactToTable(mail, name, note) {
411
	const contactTable = document.getElementById("tbody_notes_contact");
412
	const row = contactTable.insertRow(-1);
413
	const cellMail = row.insertCell(-1);
414
	const cellName = row.insertCell(-1);
415
	const cellNote = row.insertCell(-1);
416
	const cellBtnD = row.insertCell(-1);
417
418
	cellMail.className = "left";
419
	cellName.className = "left";
420
	cellNote.className = "left";
421
422
	cellMail.textContent = mail;
423
	cellName.textContent = name;
424
	cellNote.textContent = note;
425
	cellBtnD.innerHTML = "<button type=\"button\">X</button>";
426
427
	cellBtnD.onclick = function() {deleteContact(mail);};
428
}
429
430
function addRowAdmin(num) {
431
	const table = document.getElementById("tbody_admin");
432
433
	const row = table.insertRow(-1);
434
	const cellPk = row.insertCell(-1);
435
	const cellMb = row.insertCell(-1);
436
	const cellNa = row.insertCell(-1);
437
	const cellSa = row.insertCell(-1);
438
	const cellLv = row.insertCell(-1);
439
	const cellBtnPl = row.insertCell(-1);
440
	const cellBtnMn = row.insertCell(-1);
441
	const cellBtnDe = row.insertCell(-1);
442
443
	cellPk.textContent = ae.admin_getUserPkHex(num);
444
	cellMb.textContent = ae.admin_getUserSpace(num);
445
	cellNa.textContent = ae.admin_getUserNAddr(num);
446
	cellSa.textContent = ae.admin_getUserSAddr(num);
447
	cellLv.textContent = ae.admin_getUserLevel(num);
448
	cellBtnPl.innerHTML = "<button type=\"button\">+</button>";
449
	cellBtnMn.innerHTML = "<button type=\"button\">-</button>";
450
	cellBtnDe.innerHTML = "<button type=\"button\">X</button>";
451
452
	cellPk.className = "mono";
453
	if (ae.admin_getUserLevel(num) === ae.getLevelMax()) cellBtnPl.children[0].disabled = true;
454
	if (ae.admin_getUserLevel(num) === 0) cellBtnMn.children[0].disabled = true;
455
456
	const pkHex = ae.admin_getUserPkHex(num);
457
	const currentLevel = ae.admin_getUserLevel(num);
458
	cellBtnPl.children[0].onclick = function() {setAccountLevel(pkHex, currentLevel + 1);};
459
	cellBtnMn.children[0].onclick = function() {setAccountLevel(pkHex, currentLevel - 1);};
460
	cellBtnDe.children[0].onclick = function() {destroyAccount(pkHex);};
461
}
462
463
function reloadInterface() {
464
	if (!ae.isUserAdmin()) document.getElementById("btn_toadmin").hidden = true;
465
	document.getElementById("div_begin").hidden = true;
466
	document.getElementById("div_allears").hidden = false;
467
468
	clearMessages();
469
	document.getElementById("tbody_admin").innerHTML = "";
470
	document.getElementById("tbody_files").innerHTML = "";
471
	document.getElementById("tbody_notes_contact").innerHTML = "";
472
	document.getElementById("tbody_opt_addr").innerHTML = "";
473
474
	// Contacts
475
	for (let i = 0; i < ae.getContactCount(); i++) {
476
		addContactToTable(
477
			ae.getContactMail(i),
478
			ae.getContactName(i),
479
			ae.getContactNote(i)
480
		);
481
	}
482
483
	// Addresses
484
	for (let i = 0; i < ae.getAddressCount(); i++) {
485
		addAddress(i);
486
	}
487
488
	document.getElementById("addr_use_normal").textContent = ae.getAddressCountNormal();
489
	document.getElementById("addr_use_shield").textContent = ae.getAddressCountShield();
490
	document.getElementById("addr_max_normal").textContent = ae.getLimitNormalA(ae.getUserLevel());
491
	document.getElementById("addr_max_shield").textContent = ae.getLimitShieldA(ae.getUserLevel());
492
493
	if (ae.getAddressCountNormal() >= ae.getLimitNormalA(ae.getUserLevel())) document.getElementById("btn_newaddress").disabled = true;
494
	if (ae.getAddressCountShield() >= ae.getLimitShieldA(ae.getUserLevel())) document.getElementById("btn_newshieldaddress").disabled = true;
495
496
	if (ae.isUserAdmin()) {
497
		const tblLimits = document.getElementById("tbl_limits");
498
		for (let i = 0; i < 4; i++) {
499
			tblLimits.rows[i].cells[1].children[0].value = ae.getStorageLimit(i);
500
			tblLimits.rows[i].cells[2].children[0].value = ae.getLimitNormalA(i);
501
			tblLimits.rows[i].cells[3].children[0].value = ae.getLimitShieldA(i);
502
		}
503
504
		document.getElementById("btn_admin_savelimits").onclick = function() {
505
			const storageLimit = [];
506
			const addrNrmLimit = [];
507
			const addrShdLimit = [];
508
509
			for (let i = 0; i < 4; i++) {
510
				storageLimit[i] = tblLimits.rows[i].cells[1].children[0].value;
511
				addrNrmLimit[i] = tblLimits.rows[i].cells[2].children[0].value;
512
				addrShdLimit[i] = tblLimits.rows[i].cells[3].children[0].value;
513
			}
514
515
			ae.setLimits(storageLimit, addrNrmLimit, addrShdLimit, function(error) {
516
				if (error !== 0) {
517
					console.log("Failed to update limits");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
518
				}
519
			});
520
		};
521
522
		for (let i = 0; i < ae.admin_getUserCount(); i++) {
523
			addRowAdmin(i);
524
		}
525
	}
526
}
527
528
document.getElementById("btn_inbox_prev").onclick = function() {
529
	if (page > 0) {
530
		page--;
531
		clearMessages();
532
		addMessages();
533
		this.disabled = (page === 0);
534
	}
535
};
536
537
document.getElementById("btn_inbox_next").onclick = function() {
538
// TODO: Check if page too high
539
//	if (page > 0) {
540
		page++;
541
		clearMessages();
542
		addMessages();
543
		document.getElementById("btn_inbox_prev").disabled = false;
544
//	}
545
};
546
547
document.getElementById("btn_enter").onclick = function() {
548
	const txtSkey = document.getElementById("txt_skey");
549
	if (!txtSkey.reportValidity()) return;
550
551
	const btn = this;
552
	btn.disabled = true;
553
554
	ae.setKeys(txtSkey.value, function(success) {
555
		if (!success) {
556
			console.log("Invalid format for key");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
557
			btn.disabled = false;
558
			return;
559
		}
560
561
		ae.Message_Browse(false, true, function(statusBrowse) {
562
			if (statusBrowse !== 0) {
563
				console.log("Failed to enter");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
564
				btn.disabled = false;
565
				return;
566
			}
567
568
			txtSkey.value = "";
569
			reloadInterface();
570
			document.getElementById("btn_refresh").click();
571
		});
572
	});
573
};
574
575
document.getElementById("btn_refresh").onclick = function() {
576
	const btn = this;
577
	btn.disabled = true;
578
579
	ae.Message_Browse(true, false, function(error) {
580
		if (error === 0) {
581
			clearMessages();
582
			addMessages();
583
			for (let i = ae.getUplMsgCount() - 1; i >= 0; i--) {addFile(i);}
584
		} else {
585
			console.log("Failed to refresh");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
586
		}
587
588
		btn.disabled = false;
589
	});
590
};
591
592
document.getElementById("btn_contact_add").onclick = function() {
593
	const txtMail = document.getElementById("txt_newcontact_mail");
594
	const txtName = document.getElementById("txt_newcontact_name");
595
	const txtNote = document.getElementById("txt_newcontact_note");
596
597
	addContactToTable(txtMail.value, txtName.value, txtNote.value);
598
	ae.addContact(txtMail.value, txtName.value, txtNote.value);
599
600
	txtMail.value = "";
601
	txtName.value = "";
602
	txtNote.value = "";
603
604
	document.getElementById("btn_savenotes").hidden = false;
605
};
606
607
document.getElementById("btn_savenotes").onclick = function() {
608
	ae.Private_Update(function(error) {
609
		if (error === 0) {
610
			document.getElementById("btn_savenotes").hidden = true;
611
		} else {
612
			console.log("Failed to save note data");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
613
		}
614
	});
615
};
616
617
document.getElementById("btn_msgdel").onclick = function() {
618
	delMsgs("tbody_inbox", "btn_msgdel");
619
};
620
621
document.getElementById("btn_sentdel").onclick = function() {
622
	delMsgs("tbody_sentbox", "btn_sentdel");
623
};
624
625
document.getElementById("btn_send").onclick = function() {
626
	const btn = this;
627
	btn.disabled = true;
628
629
	const sfrom = document.getElementById("send_from");
630
	const stitle = document.getElementById("send_title");
631
	const sto = document.getElementById("send_to");
632
	const sbody = document.getElementById("send_body");
633
634
	if (!stitle.reportValidity() || !sto.reportValidity() || !sbody.reportValidity()) return;
635
636
	ae.Message_Create(stitle.value, sbody.value, sfrom.value, sto.value, null, function(error) {
637
		if (error === 0) {
638
			stitle.value = "";
639
			sto.value = "";
640
			sbody.value = "";
641
		} else {
642
			console.log("Failed sending message");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
643
		}
644
645
		btn.disabled = false;
646
	});
647
};
648
649
document.getElementById("btn_newaddress").onclick = function() {
650
	if (ae.getAddressCountNormal() >= ae.getLimitNormalA(ae.getUserLevel())) return;
651
652
	const txtNewAddr = document.getElementById("txt_newaddress");
653
	if (!txtNewAddr.reportValidity()) return;
654
655
	const btnN = document.getElementById("btn_newaddress");
656
	const btnS = document.getElementById("btn_newshieldaddress");
657
	btnN.disabled = true;
658
	btnS.disabled = true;
659
660
	ae.Address_Create(txtNewAddr.value, function(error1) {
661
		if (error1 === 0) {
662
			ae.Private_Update(function(error2) {
663
				document.getElementById("addr_use_normal").textContent = ae.getAddressCountNormal();
664
				addAddress(ae.getAddressCount() - 1);
665
				txtNewAddr.value = "";
666
667
				if (error2 !== 0) console.log("Failed to update the Private field");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
668
				if (ae.getAddressCountNormal() < ae.getLimitNormalA(ae.getUserLevel())) btnN.disabled = false;
669
				if (ae.getAddressCountShield() < ae.getLimitShieldA(ae.getUserLevel())) btnS.disabled = false;
670
			});
671
		} else {
672
			console.log("Failed to add address");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
673
			if (ae.getAddressCountNormal() < ae.getLimitNormalA(ae.getUserLevel())) btnN.disabled = false;
674
			if (ae.getAddressCountShield() < ae.getLimitShieldA(ae.getUserLevel())) btnS.disabled = false;
675
		}
676
	});
677
};
678
679
document.getElementById("btn_newshieldaddress").onclick = function() {
680
	if (ae.getLimitShieldA() >= ae.getLimitShieldA(ae.getUserLevel())) return;
681
682
	const btnN = document.getElementById("btn_newaddress");
683
	const btnS = document.getElementById("btn_newshieldaddress");
684
	btnN.disabled = true;
685
	btnS.disabled = true;
686
687
	ae.Address_Create("SHIELD", function(error1) {
688
		if (error1 !== 0) {
689
			console.log("Failed to add Shield address");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
690
			if (ae.getAddressCountNormal() < ae.getLimitNormalA(ae.getUserLevel())) btnN.disabled = false;
691
			if (ae.getAddressCountShield() < ae.getLimitShieldA(ae.getUserLevel())) btnS.disabled = false;
692
			return;
693
		}
694
695
		ae.Private_Update(function(error2) {
696
			document.getElementById("addr_use_shield").textContent = ae.getAddressCountShield();
697
			addAddress(ae.getAddressCount() - 1);
698
699
			if (error2 !== 0) console.log("Failed to update the Private field");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
700
			if (ae.getAddressCountNormal() < ae.getLimitNormalA(ae.getUserLevel())) btnN.disabled = false;
701
			if (ae.getAddressCountShield() < ae.getLimitShieldA(ae.getUserLevel())) btnS.disabled = false;
702
		});
703
	});
704
};
705
706
document.getElementById("btn_saveaddrdata").onclick = function() {
707
	const tbl = document.getElementById("tbody_opt_addr");
708
709
	for (let i = 0; i < tbl.rows.length; i++) {
710
		ae.setAddressAccExt(i, tbl.rows[i].cells[1].firstChild.checked);
711
		ae.setAddressAccInt(i, tbl.rows[i].cells[2].firstChild.checked);
712
	}
713
714
	ae.Address_Update(function(error) {
715
		if (error === 0) {
716
			document.getElementById("btn_saveaddrdata").hidden = true;
717
		} else {
718
			console.log("Failed to save address data");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
719
		}
720
	});
721
};
722
723
document.getElementById("btn_admin_addaccount").onclick = function() {
724
	const txtPkey = document.getElementById("txt_newacc_pkey");
725
726
	if (!txtPkey.reportValidity()) return;
727
728
	const btn = document.getElementById("btn_admin_addaccount");
729
	btn.disabled = true;
730
731
	ae.Account_Create(txtPkey.value, function(error) {
732
		if (error === 0) {
733
			addRowAdmin(ae.admin_getUserCount() - 1);
734
			txtPkey.value = "";
735
		} else {
736
			console.log("Failed to add account");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
737
		}
738
	});
739
740
	btn.disabled = false;
741
};
742
743
document.getElementById("btn_uploadfile").onclick = function() {
744
	const fileSelector = document.getElementById("upfile");
745
746
	const btn = this;
747
	btn.disabled = true;
748
749
	const reader = new FileReader();
750
	reader.onload = function() {
751
		ae.Message_Upload(true, fileSelector.files[0].name, new Uint8Array(reader.result), function(error) {
752
			if (error === 0) {
753
				addFile(ae.getFileCount() - 1);
754
			} else {
755
				console.log("Failed to upload file");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
756
			}
757
758
			btn.disabled = false;
759
		});
760
	};
761
762
	reader.readAsArrayBuffer(fileSelector.files[0]);
763
};
764
765
function navNotesMenu(num) {
766
	for (let i = 0; i < 3; i++) {
767
		if (i === num) {
768
			document.getElementById("div_notes").children[0].children[i].disabled = true;
769
			document.getElementById("div_notes").children[1 + i].hidden = false;
770
		} else {
771
			document.getElementById("div_notes").children[0].children[i].disabled = false;
772
			document.getElementById("div_notes").children[1 + i].hidden = true;
773
		}
774
	}
775
}
776
777
let btns = document.getElementsByTagName("nav")[0].getElementsByTagName("button");
778
btns[0].onclick = function() {navMenu(0);};
779
btns[1].onclick = function() {navMenu(1);};
780
btns[2].onclick = function() {navMenu(2);};
781
btns[3].onclick = function() {navMenu(3);};
782
btns[4].onclick = function() {navMenu(4);};
783
784
btns = document.getElementById("div_notes").getElementsByTagName("button");
785
btns[0].onclick = function() {navNotesMenu(0);};
786
btns[1].onclick = function() {navNotesMenu(1);};
787
btns[2].onclick = function() {navNotesMenu(2);};
788
btns[3].onclick = function() {navNotesMenu(3);};
789
790
document.getElementById("txt_skey").onkeyup = function(e) {
791
	if (e.key === "Enter") document.getElementById("btn_enter").click();
792
};
793
794
navMenu(0);
795
796
});
797